package com.learning.netease.optimize.redis.aof.client;

import java.io.IOException;
import java.net.Socket;

/**
 * ClassName: CusRedisClient
 * Description: 自定义实现JAVA客户端：Redis底层通讯原理
 * Date: 2019/2/2 10:48 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class CusRedisClient {


    /**
     * Redis 私有协议规范
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        Socket socket = new Socket("127.0.0.1", 6379);

        // 写数据
        String request = setRequestMsg("Name", "sam");
        socket.getOutputStream().write(request.getBytes());


        // 读数据
        byte[] resp = new byte[1024];
        socket.getInputStream().read(resp);
        System.out.println(new String(resp));

    }


    /**
     * 请求数据包的格式
     * <p>
     * '*<number of arguments>CRLF'              参数数量
     * $<number of bytes of arguments 1>CRLF    第一个参数长度
     * <arguments data>CRLF                     第一个参数的值
     * ...
     * <p>
     * $<number of bytes of arguments N>CRLF    第N个参数长度
     * <arguments data>CRLF                     第N个参数的值
     *
     * @param key
     * @param value
     * @return
     */
    public static String setRequestMsg(String key, String value) {
        StringBuilder builder = new StringBuilder();

        builder.append("*3").append("\r\n");
        builder.append("$").append(3).append("\r\n");
        builder.append("set").append("\r\n");

        builder.append("$").append(key.getBytes().length).append("\r\n");
        builder.append(key).append("\r\n");

        builder.append("$").append(value.getBytes().length).append("\r\n");
        builder.append(value).append("\r\n");

        System.out.println(builder);

        return builder.toString();

        // 打印出来的就是AOF存储的内容

        /*

         *3
         $3
         set
         $4
         Name
         $3
         sam

         */
    }
}
